import java.util.Stack;

/**
 * Created With IntelliJ IDEA
 * Description:leetcode：150. 逆波兰表达式求值
 * <a href="https://leetcode.cn/problems/evaluate-reverse-polish-notation/">...</a>
 * User: DELL
 * Data: 2023-01-08
 * Time: 21:05
 */

//题目规定：
//      有效的算符为 '+'、'-'、'*' 和 '/' 。
//      每个操作数（运算对象）都可以是一个整数或者另一个表达式。
//      两个整数之间的除法总是向零截断。
//      表达式中不含除零运算。
//      输入是一个根据逆波兰表示法表示的算术表达式。
//      答案及所有中间计算结果可以用 32 位整数表示。

//1. 因为题目中规定输入的是一个逆波兰表达式，因此不需要在计算过程中判断辅助栈是否为空的情况
//2. 做这道题之前，应先了解逆波兰表达式的求法
class Solution {
    public int evalRPN(String[] tokens) {
        //辅助栈
        Stack<Integer> stack = new Stack<>();
        for (String str : tokens) {
            if (isNumber(str)) {
                stack.push(Integer.parseInt(str));
            } else {
                int num2 = stack.pop();
                int num1 = stack.pop();
                switch (str) {
                    case "+":
                        stack.push(num1 + num2);
                        break;
                    case "-":
                        stack.push(num1 - num2);
                        break;
                    case "*":
                        stack.push(num1 * num2);
                        break;
                    case "/":
                        stack.push(num1 / num2);
                        break;
                    default:
                }
            }
        }
        return stack.pop();
    }
    public boolean isNumber(String token) {
        return !("+".equals(token) ||
                "-".equals(token) ||
                "*".equals(token) ||
                "/".equals(token));
    }
}